import numpy as np

# 定义原始数据集
data = {
    '姓名': ['张三', '李四', '王五', '赵六'],
    'X1_年龄': [25, 36, 45, 55],
    'X2_收入': [10000, 50000, 80000, 100000]
}

# 提取特征矩阵（n_samples, n_features）
X = np.array([data['X1_年龄'], data['X2_收入']]).T  # 形状为(4, 2)


# 定义标准归一化函数
def standardization(X):
    """
    对特征矩阵进行标准归一化（Z-Score标准化）

    参数：
    X: 原始特征矩阵 (n_samples, n_features)

    返回：
    X_standardized: 标准化后的特征矩阵
    feature_stats: 包含各特征均值和标准差的字典
    """
    n_features = X.shape[1]
    X_standardized = X.copy().astype(np.float64)
    feature_stats = {'mean': [], 'std': []}

    for i in range(n_features):
        mu = np.mean(X[:, i])  # 计算第i列均值
        sigma = np.std(X[:, i])  # 计算第i列标准差（无偏估计可选ddof=1，此处用总体标准差）
        X_standardized[:, i] = (X_standardized[:, i] - mu) / sigma
        feature_stats['mean'].append(mu)
        feature_stats['std'].append(sigma)

    return X_standardized, feature_stats


# 应用标准归一化
X_standardized, stats = standardization(X)

# 输出结果
print("原始特征矩阵：")
print("年龄：", data['X1_年龄'])
print("收入：", data['X2_收入'], "\n")

print("各特征均值：", stats['mean'])  # 年龄均值40.25，收入均值60000
print("各特征标准差：", stats['std'], "\n")  # 年龄标准差≈11.08，收入标准差≈33911.64

print("标准归一化后特征矩阵（均值0，标准差1）：")
print("年龄归一化：", np.round(X_standardized[:, 0], 4))  # 张三年龄≈-1.3763
print("收入归一化：", np.round(X_standardized[:, 1], 4))  # 张三收入≈-1.4743